<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 简易案例
    // 需求 描述一只猫的名称，颜色，叫声，技能

    // 面向过程
    // var name = "Tom";
    // var color = "black";
    // var species = "Cat";
    // function call() {
    //     console.log("喵喵");
    // }
    // function skill() {
    //     console.log("捉老鼠");
    // }


    // 面向对象: 就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与行为(方法)
    // 最简单的面向对象 (字面量对象)  => 把面向过程中的变量,函数 整合到对象中 作为对象的属性和方法

    // 字面量对象
    // var Tom = {
    //     name: "Tom",
    //     color: "black",
    //     species: "Cat",
    //     call: function () {
    //         console.log("喵喵");
    //     },
    //     skill: function () {
    //         console.log("捉老鼠");
    //     }
    // }

    // var Kitty = {
    //     name: "Kitty",
    //     color: "pink",
    //     species: "Cat",
    //     call: function () {
    //         console.log("喵喵");
    //     },
    //     skill: function () {
    //         console.log("捉老鼠");
    //     }
    // }


    // 工厂模式:(函数封装)
    // 优点: 可以根据传入的参数 快捷创建对象

    // 缺点: 
    // 1. 通过函数创建的对象 和函数本身没有关系
    // var arr = new Array();
    // console.log(arr instanceof Array);
    // var obj = new Object();
    // console.log(obj instanceof Object);
    // var p = new Promise(function () { })
    // console.log(p instanceof Promise);

    // 2. 公有的属性和方法重复创建  => 占内存


    function cat(name, color, type) {
        var obj = { // new Object();
            name: name,
            color: color,
            type: type,

            // 公有的属性和方法 (每个对象都有的)
            species: "Cat",
            call: function () {
                console.log("喵喵");
            },
            skill: function () {
                console.log("捉老鼠");
            }
        }
        return obj;
    }

    var Tom = cat("Tom", "black", "黑猫");
    console.log(Tom, Tom instanceof cat, Tom instanceof Object);

    var Kitty = cat("Kitty", "black", "田园");
    console.log(Kitty);





</script>

</html>